package per.hx.bs.sys.serviceimpl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import per.hx.bs.entity.sys.SysDictTypeDO;
import per.hx.bs.sys.dao.SysDictDao;
import per.hx.bs.entity.sys.SysDictDO;
import per.hx.bs.entity.sys.SysUserDO;
import per.hx.bs.sys.dao.SysDictTypeDao;
import per.hx.bs.util.StringUtils;

import java.util.*;

/**
 * @author HuXing
 * @date 2018/3/28  11:24
 */

@Transactional(rollbackFor = Exception.class)
@RestController
@RequestMapping(value = "sys-service/dict")
public class SysDictApiServiceImpl {
    private final
    SysDictDao sysDictDao;

    private final
    SysDictTypeDao sysDictTypeDao;

    @Autowired
    public SysDictApiServiceImpl(SysDictTypeDao sysDictTypeDao, SysDictDao sysDictDao) {
        this.sysDictTypeDao = sysDictTypeDao;
        this.sysDictDao = sysDictDao;
    }

    /**
     * 获取爱好列表
     *
     * @param sysUserDO 用户信息
     * @return 兴趣列表
     */

    @PostMapping(value = "/hobby")
    public List<SysDictDO> getHobbyList(@RequestBody SysUserDO sysUserDO) {
        Map<String, Object> param = new HashMap<>(16);
        param.put("type", "hobby");
        List<SysDictDO> hobbyList = sysDictDao.list(param);

        if (StringUtils.isNotEmpty(sysUserDO.getHobby())) {
            String[] userHobbes = sysUserDO.getHobby().split(";");
            for (String userHobby : userHobbes) {
                for (SysDictDO hobby : hobbyList) {
                    if (!Objects.equals(userHobby, hobby.getId().toString())) {
                        continue;
                    }
                    hobby.setRemark("true");
                    break;
                }
            }
        }
        return hobbyList;
    }

    /**
     * 获取性别列表
     *
     * @return 性别列表
     */
    @GetMapping(value = "/sex")
    public List<SysDictDO> getSexList() {
        Map<String, Object> param = new HashMap<String, Object>(1);
        param.put("type", "sex");
        return sysDictDao.list(param);
    }

    /**
     * 按条件获取数据
     *
     * @param map 条件
     * @return 数据字典集合
     */
    @PostMapping(value = "/list")
    public List<SysDictDO> list(@RequestBody Map<String, Object> map) {
        return sysDictDao.list(map);
    }

    /**
     * 按条件统计数量
     *
     * @param map 条件
     * @return 数量
     */
    @PostMapping(value = "/count")
    public int count(@RequestBody Map<String, Object> map) {
        return sysDictDao.count(map);
    }

    /**
     * 通过数据字典ID 获取数据
     *
     * @param id 数据字典Id
     * @return 数据信息
     */
    @GetMapping(value = "/{id}")
    public SysDictDO get(@PathVariable("id") Long id) {
        return sysDictDao.selectById(id);
    }

    /**
     * 保存数据字典
     *
     * @param sysDictDO 数据信息
     * @return 影响行数
     */
    @PostMapping(value = "/save")
    public int save(@RequestBody SysDictDO sysDictDO) {
        SysDictTypeDO dictTypeDO = sysDictTypeDao.selectOne(new SysDictTypeDO(sysDictDO.getType()));
        if (dictTypeDO != null) {
            sysDictDO.setTypeName(dictTypeDO.getTypeName());
            return sysDictDao.insert(sysDictDO);
        } else {
            return 0;
        }
    }

    /**
     * 更新数据自动信息
     *
     * @param sysDictDO 数据字典信息
     * @return 影响行数
     */
    @PostMapping(value = "/update")
    public int update(@RequestBody SysDictDO sysDictDO) {
        return sysDictDao.updateById(sysDictDO);
    }

    /**
     * 通过id删除数据字典信息
     *
     * @param id 数据字典id
     * @return 影响行数
     */
    @DeleteMapping(value = "/remove")
    public int remove(@RequestParam("id") Long id) {
        return sysDictDao.deleteById(id);
    }

    /**
     * 通过id删除数据字典信息
     *
     * @param ids 数据字典ids
     * @return 影响行数
     */
    @DeleteMapping(value = "/batchRemove")
    public int batchRemove(@RequestParam("ids") Long[] ids) {
        return sysDictDao.deleteBatchIds(Arrays.asList(ids));
    }

    /**
     * 获取数据字典类型
     *
     * @return 数据字典类型
     */
    @PostMapping(value = "/type/list")
    public List<SysDictTypeDO> listType(@RequestBody Map<String, Object> map) {
        return sysDictTypeDao.list(map);
    }

    /**
     * 按条件统计数量
     *
     * @param map 条件
     * @return 数量
     */
    @PostMapping(value = "/type/count")
    public int countType(@RequestBody Map<String, Object> map) {
        return sysDictTypeDao.count(map);
    }

    /**
     * 根据type获取数据
     *
     * @param type 数据类型
     * @return 数据字典
     */
    @GetMapping(value = "/list/{type}")
    public List<SysDictDO> listByType(@PathVariable("type") String type) {
        Map<String, Object> map = new HashMap<>(1);
        map.put("type", type);
        return sysDictDao.selectByMap(map);
    }

    /**
     * 保存数据字典类型
     *
     * @param dictTypeDO 枢轴点类型信息
     * @return 影响行数
     */
    @PostMapping(value = "/type/save")
    public int save(@RequestBody SysDictTypeDO dictTypeDO) {
        return sysDictTypeDao.insert(dictTypeDO);
    }

    /**
     * 检查数据是否存在
     *
     * @param dictDO 查询条件
     * @return 查询结果
     */
    @PostMapping(value = "/exit")
    public boolean dictExit(@RequestBody SysDictDO dictDO) {
        return sysDictDao.selectOne(dictDO) != null;
    }

    /**
     * 检查数据是否存在
     *
     * @param dictTypeDO 查询条件
     * @return 查询结果
     */
    @PostMapping(value = "/type/exit")
    public boolean typeExit(@RequestBody SysDictTypeDO dictTypeDO) {
        return sysDictTypeDao.selectOne(dictTypeDO) != null;
    }

    /**
     * 通过id获取 数据类型信息
     *
     * @param id 类型id
     * @return 数据类型
     */
    @GetMapping(value = "/type/{id}")
    public SysDictTypeDO type(@PathVariable("id") Long id) {
        return sysDictTypeDao.selectById(id);
    }

    /**
     * 更新数据字典类型
     *
     * @param dictTypeDO 数据类型
     * @return 影响行数
     */
    @PutMapping(value = "/type/update")
    public int updateType(@RequestBody SysDictTypeDO dictTypeDO) {
        return sysDictTypeDao.updateById(dictTypeDO);
    }

    /**
     * 散发出数据字典
     *
     * @param id 用户数据字典id
     * @return 影响行数
     */
    @DeleteMapping(value = "/type/remove")
    public int removeType(@RequestParam("id") Long id) {
        return sysDictTypeDao.deleteById(id);
    }


}
